#include "analysis_handle.h"

// 解析数据流，返回解析后的数据包指针，如果没有完整的数据包则返回NULL
PACKET* parse_data(u8 *buffer, int buffer_len)
{
    PACKET *packet = NULL;
    int i=0;
    // 查找包头
    // 查找包头
    while (i < buffer_len) 
    {
        if (buffer[i] == PACKET_HEADER) 
        {
            // 找到包头，尝试解析数据包
            if (i + 3 < buffer_len) 
            {
                // 读取长度
                u16 length = (buffer[i+2]<<8)|buffer[i+1];
                printf("length is %d\n",length);
                // 计算数据包总长度
                u16 packet_length = length+1+1+2+2; //data有效长度+包头+包尾+数据长度+CRC16长度
                if (i+packet_length <= buffer_len) 
                {
                    // 分配数据包结构体内存
                    packet=(PACKET *)malloc(sizeof(PACKET));
                    u8 *data = (u8 *)malloc(sizeof(u8)*length);
                    memcpy(data, &buffer[i+3],length);
                    packet->length = length;
                    // 分配数据存储空间并复制数据
                    packet->data = data;
                    data =NULL;
                    // 返回解析后的数据包
                    return packet;
                } else 
                {
                    // 数据不完整，跳出循环等待更多数据
                    break;
                }
            }
        }
        i++;
    }
    // 没有找到完整的数据包，返回NULL
    return NULL;
}


void analysis_receive_message(u8 *buf,int len,DATA_SOURCE source)
{   
    PACKET *packet;
    int buffer_len=len;
    while (1) //有效长度不为0
    {
        if (buffer_len == 0)
        {
            printf("analysis over\n");
            break;
        }

        if ((packet = parse_data(buf,len)) != NULL)
        {
            LOG_INFO("Received Packet:length=0x%d",packet->length);
            attribute_handle_data(packet->data,packet->length,source);
            memmove(buf,buf+(packet->length+6),buffer_len-(packet->length+6));
            buffer_len-=(packet->length+6);
            free(packet->data);
            free(packet);
        }
        else
        {
            printf("1111\n");
            break;
        }
    }
}